home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -in_the_mag- / reader_requests / scilab / demos / lmitool / lmidem.sci < prev    next >
Text File  |  1999-09-16  |  6KB  |  199 lines

  1. function [txtdo]=lmidem(PROBNAME,XNAME,DNAME) 
  2. [LHS,RHS]=argn(0);
  3. txtdo=[]
  4.  
  5. if RHS ~=3 then
  6.   PROBNAME1='foo';
  7.   XNAME1='X1,X2,...';
  8.   DNAME1='D1,D2,...';
  9.  
  10.   if RHS==1 then
  11.     tt=read(PROBNAME,-1,1,'(a)');
  12.     tt=stripblanks(tt);
  13.     mat=str2vec(tt);
  14.     [q1,p1]=find(mat'=='[');
  15.         [q2,p2]=find(mat'==']');
  16.     XNAME1=mat(p1(1),q1(1)+1:q2(1)-1);
  17.     XNAME1=strcat(XNAME1);
  18.     [q1,p1]=find(mat'=='(');
  19.     [q2,p2]=find(mat'==')');
  20.     DNAME1=mat(p1(1),q1(1)+1:q2(1)-1);
  21.     DNAME1=strcat(DNAME1);
  22.     [q2,p2]=find(mat'=='=');
  23.     PROBNAME1=mat(p2(1),q2(1)+1:q1(1)-1);
  24.     PROBNAME1=strcat(PROBNAME1);
  25.   end
  26.  
  27.   labels=['LMI problem name: ';'Names of unknown matrices: ';...
  28.           'Names of data matrices: '];
  29. //  [ok,PROBNAME,XNAME,DNAME]=getvalue(['Problem definition';
  30. //      'LMITOOL will generate for you a skeleton of the functions needed';
  31. //        ' (see User''s Guide for details). For that, you need to specify:';
  32. //        '1- Name of you problem which will be given to the solver function,';
  33. //        '2- Names of unknown matrices or list of unknown matrices,';
  34. //        '3- Names of data matrices or list of data matrices.'],labels,...
  35. //        list('str',1,'str',1,'str',1),...
  36. //        [PROBNAME1+'            ',XNAME1+'           ',DNAME1+'         ']);
  37. ok=%t
  38. PROBNAME=PROBNAME1;XNAME=XNAME1;DNAME=DNAME1;
  39.     if ok=%f then 
  40.         txtdo='Try again';return;
  41.       end
  42.     end      
  43. //    PROBNAME=stripblanks(PROBNAME);
  44. //    XNAME=stripblanks(XNAME);
  45. //    DNAME=stripblanks(DNAME);
  46.  
  47.  
  48.       pathname=unix_g('pwd');
  49.       fname = pathname+'/'+PROBNAME+'.sci';
  50.       Today=unix_g('date');
  51.  
  52.       txt0='function ['+XNAME+']='+PROBNAME+'('+DNAME+')'
  53.       txt0=[txt0;'/'+'/ Generated by lmitool on '+Today;'  '];
  54.  
  55.       txt0=[txt0;
  56.           '  Mbound = 1e3;';
  57.           '  abstol = 1e-10;';
  58.           '  nu = 10;';
  59.           '  maxiters = 100;';
  60.           '  reltol = 1e-10;';
  61.           '  options=[Mbound,abstol,nu,maxiters,reltol];'
  62.           '   ']
  63.  
  64.       nv=length(XNAME);
  65.       index_commas=[];
  66.       for k=1:nv
  67.         if part(XNAME,k)==',' then index_commas=[index_commas,k],end
  68.       end
  69.       vnum = length(index_commas)+1;
  70.       index_commas = [0 index_commas length(XNAME)+1];
  71.  
  72.       txt1=[];txt2=[];
  73.       for i = 1:vnum,
  74.         vname = part(XNAME,index_commas(i)+1:index_commas(i+1)-1);
  75.         if RHS<>1 then  
  76.           txt1 = [txt1;
  77.               vname+'_init=...']
  78.         end
  79.         txt2=[txt2,vname+'_init'];
  80.       end
  81.  
  82.  
  83.  
  84.       txts1=['function [LME,LMI,OBJ]='+PROBNAME+'_eval(XLIST)';
  85.           '['+XNAME+']=XLIST(:)']
  86.       if RHS ~= 1 then
  87.         txts2=['LME=...';'LMI=...';'OBJ=...']
  88.       else
  89.         [p,q]=size(mat);
  90.         ind=[]
  91.         for i=1:p
  92.           if mat(i,2:7)==['/','/','/','/','/','/']  then
  93.             ind=[ind i];
  94.           end
  95.         end
  96.         if prod(size(ind))<>4 then 
  97.           error('File not generated by lmitool or badly modified');
  98.         end
  99.         txt1=[];
  100.         for i=ind(1)+1:ind(2)-1
  101.           txt1=[txt1;strcat(mat(i,:))];
  102.         end
  103.         txts2=[];
  104.         for i=ind(4)+1:p
  105.           txts2=[txts2;strcat(mat(i,:))];
  106.         end
  107.       end
  108.  
  109.       sep11=['/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'...
  110.               +'/'+'INITIAL GUESS']
  111.       sep12=['/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'...
  112.               +'/'+' ']
  113.       sep13=['/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'...
  114.               +'/'+'LME, LMI and OBJ']
  115.  
  116.       sep2=['/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'...
  117.               +'/'+'EVALUATION FUNCTION'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/'+'/']
  118.  
  119.       txt2=[
  120.           'XLIST0=list('+strcat(txt2,',')+')';
  121.           'XLIST=lmisolver(XLIST0,'+PROBNAME+'_eval,options)';
  122.           '['+XNAME+']=XLIST(:)'];
  123.  
  124.       txt4=[txt0;sep11;txt1;sep12;' ';txt2;' ';' ';' ';...
  125.               sep2;' ';txts1;' ';sep13;txts2];
  126.  
  127.       if RHS==0|RHS==1 then
  128.         select %demo_
  129.         case 1 
  130.           txtdem=['The problem is here:';
  131.                   'Minimize gamma  under the constraints:'
  132.                   '    X''-X = 0';
  133.                   '    and '
  134.                   '[A X + X A'''+', B, X C'']';
  135.                   '[ B'''+', -gamma I, D'']';
  136.                   '[C X, D, -gamma I] < 0';
  137.                 '   '; 
  138.                 'This problem is solved by the function below (do not edit)'
  139.                 ]
  140.           
  141.           case 2 
  142.             txtdem=['The problem is here:';
  143.                   'Minimize trace(P+Q)  under the constraints:'
  144.                   '    P''-P = 0';
  145.                   '    Q''-Q = 0';
  146.                   '    and '
  147.                   '    NB'' (A Q + Q A'' + Q) NB < 0';
  148.                   '    NC'' (A P + P A'' + P) NC < 0';
  149.                   '    [P I; I Q] > 0'
  150.                   ' where NB=kernel(B) and NC=kernel(C'')'
  151.                 '   '; 
  152.                 'This problem is solved by the function below (do not edit)'
  153.                 ]
  154.           case 3
  155.            txtdem=['The problem is here:';
  156.                'Find X such that A*X+X*B-C (continuous time)'
  157.                'or Find X such that A*X*B-C (discrete time)'
  158.                ]
  159.           end
  160.         [txt4]=x_dialog(txtdem,[txt4]);
  161.         end
  162.       if txt4=[] then txtdo='Try again';return;end
  163.         txt=[txt4];
  164.         n=1;
  165. function [vec]=str2vec(str)
  166. w=length(str);
  167. [p,q]=size(w);ma=max(w);
  168. vec=[];
  169. for i=1:ma
  170.   vec=[vec part(str,i)]
  171. end
  172.  
  173. function txt=stripblanks(txt)
  174. // stripblanks - strips leading and trailing blanks of strings
  175. //%SYNTAX
  176. // txt=stripblanks(txt)
  177. //%PARAMETERS
  178. // txt : string or matrix of strings
  179. //%DESCRIPTION
  180. // stripblanks strips leading and trailing blanks of strings
  181. //!
  182. [m,n]=size(txt)
  183. for l=1:m
  184.   for k=1:n
  185.     t=txt(l,k)
  186.     l2=length(t)
  187.     while l2>0 then
  188.       if part(t,l2)==' ' then l2=l2-1,else break,end //trailing blanks
  189.     end
  190.     l1=1
  191.     while l1<l2 then
  192.       if part(t,l1)==' ' then l1=l1+1,else break,end //leading blanks
  193.     end
  194.     txt(l,k)=part(t,l1:l2)
  195.   end
  196. end
  197.  
  198.  
  199.